package presenter;

import com.toedter.calendar.JDateChooser;
import models.HoursTableModel;
import org.joda.time.DateTime;
import org.joda.time.Hours;
import org.joda.time.JodaTimePermission;
import table_objects.DzienPracy;

import javax.swing.*;
import javax.swing.table.TableModel;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.List;

/**
 * Autor: Daniel Michalski
 * Data: 23.06.13
 */

public class Presenter {
    public static final String FILE_NAME = "dni.data";

    private JDateChooser dateChooser;
    private JSpinner godzinaWejsciaSpinner;
    private JSpinner minutyWejsciaSpinner;
    private JSpinner godzinaWyjsciaSpinner;
    private JSpinner minutyWyjsciaSpinner;
    private JTable tabela;
    private JLabel ileGodzinLabel;

    public Presenter() {}

    private class SluchaczPrzyciskuZapisz implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent e) {
            if (czyPoprawneDaneWFormularzu()) {
                int godzinaWejscia = Integer.parseInt(godzinaWejsciaSpinner.getValue().toString());
                int minutyWejscia = Integer.parseInt(minutyWejsciaSpinner.getValue().toString());
                int godzinaWyjscia = Integer.parseInt(godzinaWyjsciaSpinner.getValue().toString());
                int minutyWyjscia = Integer.parseInt(minutyWyjsciaSpinner.getValue().toString());

                GregorianCalendar calendar = new GregorianCalendar();
                calendar.setTime(dateChooser.getDate());

                calendar.set(Calendar.HOUR, godzinaWejscia);
                calendar.set(Calendar.MINUTE, minutyWejscia);
                DateTime czasWejscia = new DateTime(calendar.getTime());

                calendar.set(Calendar.HOUR, godzinaWyjscia);
                calendar.set(Calendar.MINUTE, minutyWyjscia);
                DateTime czasWyjscia = new DateTime(calendar.getTime());

                DzienPracy dzienPracy = new DzienPracy(czasWejscia, czasWyjscia, dateChooser.getDate());

                HoursTableModel model = (HoursTableModel)tabela.getModel();

                if (model.czyJestJuzTakaData(dateChooser.getDate()))
                    pokazDialogTaSamaData();
                else {
                    model.addDzienPracy(dzienPracy);
                    ileGodzinLabel.setText("" + model.ileGodzinWMiesiacu());
                }

            } else {
                pokazDialogNiepoprawneDane();
            }
        }
    }

    private class UsunBtnListener implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent e) {
            int removeItemIndex = tabela.getSelectedRow();

            HoursTableModel tableModel = (HoursTableModel) tabela.getModel();
            if (removeItemIndex != -1) {
                tableModel.removeItem(removeItemIndex);
                ileGodzinLabel.setText("" + tableModel.ileGodzinWMiesiacu());
            }
            else
                pokazDialogNieZaznaczonoWiersza();
        }
    }

    private void pokazDialogTaSamaData() {
        JOptionPane.showMessageDialog(null, "Wprowadzono już dane odnośnie wybranego dnia", "Informacja", JOptionPane.INFORMATION_MESSAGE);
    }

    private void pokazDialogNieZaznaczonoWiersza() {
        JOptionPane.showMessageDialog(null, "Nie wybrano zadnego wiersza", "Informacja", JOptionPane.INFORMATION_MESSAGE);
    }


    private boolean czyPoprawneDaneWFormularzu() {
        try {
            int godzinaWejscia = Integer.parseInt(godzinaWejsciaSpinner.getValue().toString());
            int minutyWejscia = Integer.parseInt(minutyWejsciaSpinner.getValue().toString());
            int godzinaWyjscia = Integer.parseInt(godzinaWyjsciaSpinner.getValue().toString());
            int minutyWyjscia = Integer.parseInt(minutyWyjsciaSpinner.getValue().toString());

            if (godzinaWejscia <= 24 && minutyWejscia < 60 && godzinaWyjscia <= 24 && minutyWyjscia <= 60){
                return godzinaWejscia < godzinaWyjscia || godzinaWejscia == godzinaWyjscia && minutyWejscia < minutyWyjscia;
            } else {
                return false;
            }

        } catch (NumberFormatException e) {
            return false;
        }
    }

    private ArrayList<DzienPracy> pobierzDniPracyZPliku() {
        ArrayList<DzienPracy> dni = new ArrayList<DzienPracy>();

        try{
            //use buffering
            InputStream file = new FileInputStream(FILE_NAME);
            InputStream buffer = new BufferedInputStream( file );
            ObjectInput input = new ObjectInputStream ( buffer );
            try{
                //deserialize the List
                return (ArrayList < DzienPracy >)input.readObject();
            }
            finally{
                input.close();
            }
        }
        catch(ClassNotFoundException ex){
            System.out.println("Cannot perform input. Class not found.");
        }
        catch(IOException ex){
            System.out.println("Cannot perform input.");
        }
        return null;
    }

    private void pokazDialogNiepoprawneDane() {
        JOptionPane.showMessageDialog(null, "Wprowadzono niepoprawne dane.", "Informacja", JOptionPane.INFORMATION_MESSAGE);
    }

    public void setDateChooser(JDateChooser dateChooser) {
        this.dateChooser = dateChooser;
    }

    public void setGodzinaWejsciaSpinner(JSpinner godzinaWejsciaSpinner) {
        this.godzinaWejsciaSpinner = godzinaWejsciaSpinner;
    }

    public void setMinutyWejsciaSpinner(JSpinner minutyWejsciaSpinner) {
        this.minutyWejsciaSpinner = minutyWejsciaSpinner;
    }

    public void setGodzinaWyjsciaSpinner(JSpinner godzinaWyjsciaSpinner) {
        this.godzinaWyjsciaSpinner = godzinaWyjsciaSpinner;
    }

    public void setMinutyWyjsciaSpinner(JSpinner minutyWyjsciaSpinner) {
        this.minutyWyjsciaSpinner = minutyWyjsciaSpinner;
    }

    public void setZapiszBT(JButton zapiszBT) {
        zapiszBT.addActionListener(new SluchaczPrzyciskuZapisz());
    }

    public void setTabela(JTable tabela) {
        this.tabela = tabela;

        HoursTableModel model = new HoursTableModel(pobierzDniPracyZPliku());
        tabela.setModel(model);
        ileGodzinLabel.setText("" + model.ileGodzinWMiesiacu());
    }

    public void setIleGodzinLabel(JLabel ileGodzinLabel) {
        this.ileGodzinLabel = ileGodzinLabel;
    }

    public void setUsunBtn(JButton usunBtn) {
        usunBtn.addActionListener(new UsunBtnListener());
    }
}
